#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int cnt = 0;

void* Count(void* args)
{
    pthread_detach(pthread_self()); //分离进程
    uint64_t number = (uint64_t)args;
    cout << "pthread: " << number << " creat success" << endl;
    while(true)
    {
        pthread_mutex_lock(&lock);
        // 这里要注意除了我们的cnt是临界资源,我们的显示器也是临界资源哟！
        // 同一个时间内,存在多个线程想向显示器写入内容
        // 我们怎么知道我们要让一个线程去休眠？
        // 一定是临界资源没有就绪,临界资源也是有状态的
        // 但是我们怎么知道临界资源的状态呢？它的就绪和不就绪我们怎么知道？
        // 自行判断呗！所以判断是在访问临界资源，判断必须在加锁之后
        pthread_cond_wait(&cond, &lock); //?为什么在这里 1.pthread_cond_wait让线程等待的时候，会自动释放锁！
        cout << "pthread: " << number << ", cnt: " << cnt++ << endl;
        pthread_mutex_unlock(&lock);
    }
}

int main()
{
    for(uint64_t i = 0; i < 5; i++)
    {   
        pthread_t tid;
        pthread_create(&tid, nullptr, Count, (void*)i);
        // 注意,这里不能传入&i,因为此时传过去拿到的是i的地址，
        // 如果从线程解引用到&i，就可以修改i的值,从而影响主线程的逻辑
    }

    sleep(3);
    cout << "main thread ctrl begin: " << endl;


    while(true)
    {
        sleep(1);
        // 唤醒指定条件变量下的等待队列的一个线程,默认都是第一个
        // pthread_cond_signal(&cond);
        // 唤醒一批进程
        pthread_cond_broadcast(&cond);
        cout << "signal one thread..." << endl;
    }

    return 0;
}